package com.example.sdk_test_demo;

import android.app.Activity;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Toast;

import com.example.sdk_test_demo.loginverify.TestProcess;
import com.mchsdk.open.AnnounceTimeCallBack;
import com.mchsdk.open.ChangePlayerLevelCallback;
import com.mchsdk.open.ChangeRoleNameCallback;
import com.mchsdk.open.GPExitResult;
import com.mchsdk.open.GPUserResult;
import com.mchsdk.open.IGPExitObsv;
import com.mchsdk.open.IGPUserObsv;
import com.mchsdk.open.MCApiConstants;
import com.mchsdk.open.MCApiFactory;
import com.mchsdk.open.OrderInfo;
import com.mchsdk.open.PayCallback;
import com.mchsdk.open.UploadRoleCallBack;


public class MainActivity extends Activity {


    private static final String TAG = "MainActivity";

    private int shopPrice = 1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sdk_main);

        initView();
        initData();
    }

    private void initView() {
        MCApiFactory.getMCApi().startFloating(MainActivity.this);
        findViewById(R.id.btnPay).setOnClickListener(myOnlickListener);

        //返回手机桌面
        findViewById(R.id.btnExit).setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                MCApiFactory.getMCApi().exitDialog(MainActivity.this, mExitObsv);
            }
        });

        findViewById(R.id.btnCancel).setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                MCApiFactory.getMCApi().loginout(MainActivity.this);
            }
        });
        //修改玩家
        findViewById(R.id.id_test_level).setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                MCApiFactory.getMCApi().changePlayerLevel("role_level", levelCallback);
            }
        });
        findViewById(R.id.id_test_name).setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                MCApiFactory.getMCApi().changeRoleName("role_name ", roleNameCallback);
            }
        });
        //查看log
        findViewById(R.id.btnShowLog).setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(MainActivity.this, ShowLogActivity.class));
            }
        });
        //登录
        findViewById(R.id.login).setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                //调用登录接口
                MCApiFactory.getMCApi().startlogin(MainActivity.this, loginCallback);
            }
        });

        //设置调试参数
        findViewById(R.id.btn_setTestParams).setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivityForResult(new Intent(MainActivity.this, TestActivity.class), 1);
            }
        });

        //上传角色
        findViewById(R.id.btnUploadRole).setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {
                MCApiFactory.getMCApi().uploadRole(MainActivity.this, "117", "1", "德玛西亚",
                        "对面的坑货你别怂", "27", uploadRoleCallBack);
            }
        });
    }

    private void initData() {
        // 第一个参数和第二个参数：渠道id和渠道名称，一般联运不会特殊要求，这里填写固定值“0”和“自然注册”即可
        //第三、第四、第五个参数分别为： 游戏id、游戏名称、游戏appid，一般联运会要求填写对应游戏的真实参数以方便在联运后台区分对接是否成功
        // 第六、第七个参数：访问秘钥和联运SDK服务器地址联运提供

        MCApiFactory.getMCApi().setParams("0", // 渠道id
                "自然注册",// 渠道名称
                "18", // 游戏id(编号)
                "开心斗地主(安卓版)",// 游戏名称
                "37945C37B2B4970DD"// 游戏appid
                , "CgsPEgsLEg8LCg==",// 访问秘钥： (SDK访问服务器时的加密key)
                "http://ceshisy.vlcms.com/sdk.php/");// 联运SDK服务器地址

        // 2.初始化方法
        MCApiFactory.getMCApi().init(this, true);

        /** 3. 个人中心里面点击退出登录执行的退出回调接口,根据实际需要选择 **/
        MCApiFactory.getMCApi().initExitFromPersonInfoParams(mExitObsvPerson);

    }

    /**
     * 上传角色回调
     * 1：成功 ，其他为失败
     */
    private UploadRoleCallBack uploadRoleCallBack = new UploadRoleCallBack() {
        @Override
        public void onUploadComplete(String result) {
            Log.i(TAG, "上传角色回调: " + result);
            if ("1".equals(result)) {
                Toast.makeText(MainActivity.this, "上传角色成功", Toast.LENGTH_SHORT).show();
            }
        }
    };
    /**
     * 个人中心退出方法回调，根据实际需要进行操作
     */
    private IGPExitObsv mExitObsvPerson = new IGPExitObsv() {

        @Override
        public void onExitFinish(GPExitResult gpExitResult) {
            switch (gpExitResult.mResultCode) {
                case GPExitResult.GPSDKResultCodeOfPersonInfo:
                    Log.i(TAG, "退出回调:执行SDK个人中心退出方法");
                    break;
                default:
                    break;
            }
        }
    };

    /**
     * 退出界面回调接口
     */
    private IGPExitObsv mExitObsv = new IGPExitObsv() {
        @Override
        public void onExitFinish(GPExitResult exitResult) {
            switch (exitResult.mResultCode) {
                case GPExitResult.GPSDKExitResultCodeError:
                    Log.e(TAG, "退出回调:调用退出弹框失败");
                    break;
                case GPExitResult.GPSDKExitResultCodeExitGame:
                    Log.e(TAG, "退出回调:退出方法回调");
                    // 关闭悬浮窗
                    MCApiFactory.getMCApi().stopFloating(MainActivity.this);
                    // 下面是退出逻辑,解决退出之后微信还在的问题
                    Intent MyIntent = new Intent(Intent.ACTION_MAIN);
                    MyIntent.addCategory(Intent.CATEGORY_HOME);
                    startActivity(MyIntent);
//                    // 你自己的退出逻辑，退出程序
//                    finish();
//                    System.exit(0);
                    break;
            }
        }
    };

    OnClickListener myOnlickListener = new OnClickListener() {

        @Override
        public void onClick(View v) {

            switch (v.getId()) {
                case R.id.btnPay:

                    OrderInfo order = new OrderInfo();
                    order.setProductName("灭世者的死亡之帽");// 物品名称
                    order.setProductDesc("灭世者的死亡之帽，是著名竞技类游戏《英雄联盟》中游戏道具。它可以提供大量的法术强度和额外的百分比法强，是暴力型法师、追求极限法强必备的装备，也是联盟里最热门的装备之一"); // 物品描述
                    order.setAmount(shopPrice);//商品价格（单位分）
                    order.setExtendInfo("这里是透传参数"); // 用于确认交易给玩家发送商品
                    order.setServerName("德玛西亚");
                    order.setRoleName("对面的坑货你别怂");
//				order.setGameServerId("12");//游戏区服ID
                    MCApiFactory.getMCApi().pay(MainActivity.this, order, payCallback);
                    break;
                default:
                    break;
            }
        }
    };

    /**
     * 登录回调接口
     */
    private IGPUserObsv loginCallback = new IGPUserObsv() {
        @Override
        public void onFinish(GPUserResult result) {
            switch (result.getmErrCode()) {
                case GPUserResult.USER_RESULT_LOGIN_FAIL:
                    Toast.makeText(MainActivity.this, "登录失败", Toast.LENGTH_LONG)
                            .show();
                    Log.w(TAG, "登录失败");
                    break;
                case GPUserResult.USER_RESULT_LOGIN_SUCC:
                    Toast.makeText(MainActivity.this, "登录成功", Toast.LENGTH_LONG)
                            .show();
                    MCApiFactory.getMCApi().startFloating(MainActivity.this);
                    String uid = result.getAccountNo();// 登录用户id
                    String token = result.getToken();
                    result.getAccount();
                    Log.w(TAG, "userid = " + uid + "， token = " + token);
                    // 将这里返回的用户id和token返回给cp服务器，cp服务器发送给sdk服务器验证登录结果
                    // 以下代码模拟服cp服务器访问sdk服务器登录验证,这个验证需要写在cp服务器
                    TestProcess process = new TestProcess();
                    process.token = token;
                    process.user_id = uid;
                    process.post(verifyLoginhandler);
//                    //设置防沉迷回调
                    MCApiFactory.getMCApi().initAnnounceTimeCallBack(announceTimeCallBack);
                    break;
            }
        }
    };


    private Handler verifyLoginhandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            Log.w(TAG, "验证结果:" + (String) msg.obj);
        }
    };

    /**
     * 支付结果回调
     */
    private PayCallback payCallback = new PayCallback() {
        @Override
        public void callback(String errorcode) {
            if (TextUtils.isEmpty(errorcode)) {
                return;
            }
            Log.w(TAG, errorcode);
            if ("0".equals(errorcode)) {
                Toast.makeText(MainActivity.this, "支付成功", Toast.LENGTH_LONG).show();
            } else if ("1".equals(errorcode)) {
                //可以当做支付成功
                Toast.makeText(MainActivity.this, "支付宝支付正在确认", Toast.LENGTH_LONG).show();
            } else if ("2".equals(errorcode)) {
                Toast.makeText(MainActivity.this, "支付宝支付未获取到支付结果", Toast.LENGTH_LONG).show();
            } else {
                Toast.makeText(MainActivity.this, "支付失败", Toast.LENGTH_LONG).show();
            }
        }
    };

    /**
     * 修改玩家等级结果回调
     */
    private ChangePlayerLevelCallback levelCallback = new ChangePlayerLevelCallback() {
        @Override
        public void callback(String result) {
            if (TextUtils.isEmpty(result)) {
                return;
            }
            if ("1".equals(result)) {
                Toast.makeText(MainActivity.this, "修改role_level成功", Toast.LENGTH_LONG).show();
            } else if ("0".equals(result)) {
                Toast.makeText(MainActivity.this, "修改role_level失败", Toast.LENGTH_LONG).show();
            }
        }
    };

    /**
     * 防沉迷时间回掉
     */
    private AnnounceTimeCallBack announceTimeCallBack = new AnnounceTimeCallBack() {
        @Override
        public void callback(String result) {
            Log.i(TAG, "result: " + result);
            if (TextUtils.isEmpty(result)) {
                return;
            }
            if ("1".equals(result)) {
                //第一次到时通知
                Log.i(TAG, "第一次到时通知");
            }
            if ("2".equals(result)) {
                //第二次到时通知,玩家进入疲劳游戏时间
                Log.i(TAG, "第二次到时通知");
            }
            if ("3".equals(result)) {
                Log.e(TAG, "时间到，停止计时。");
            }

        }
    };

    /**
     * 修改用户名结果回调
     */
    private ChangeRoleNameCallback roleNameCallback = new ChangeRoleNameCallback() {
        @Override
        public void callback(String result) {
            if (TextUtils.isEmpty(result)) {
                return;
            }
            if ("1".equals(result)) {
                Toast.makeText(MainActivity.this, "修改role_name成功", Toast.LENGTH_LONG).show();
            } else if ("0".equals(result)) {
                Toast.makeText(MainActivity.this, "修改role_name失败", Toast.LENGTH_LONG).show();
            }
        }
    };

    /**
     * 游戏从后台开始，开始计时
     */
    @Override
    protected void onResume() {
        super.onResume();
        //操作悬浮窗
        MCApiFactory.getMCApi().startFloating(MainActivity.this);
        MCApiFactory.getMCApi().onResume();
    }


    @Override
    protected void onPause() {
        super.onPause();
        MCApiFactory.getMCApi().stopFloating(MainActivity.this);
    }

    /**
     * 游戏进入后台或退出游戏时，请求下线（下线通知）
     */
    @Override
    protected void onStop() {
        super.onStop();
        MCApiFactory.getMCApi().onStop(MainActivity.this);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        MCApiFactory.getMCApi().stopFloating(MainActivity.this);
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN) {
            MCApiFactory.getMCApi().exitDialog(MainActivity.this, mExitObsv);
        }
        return super.onKeyDown(keyCode, event);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (1 == requestCode && null != data) {
            shopPrice = data.getIntExtra("price", 1);
        }
    }

    @Override
    public boolean onKeyUp(int keyCode, KeyEvent event) {
        return super.onKeyUp(keyCode, event);
    }

    /*
    * 1.如果你APP设置的targetSdkVersion大于和等于23，需要在登录Activity添加如下回调，用于通知权限申请结果
    * 2.如果不获取手机设备码可以不用配置
    */
    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        doNext(requestCode, grantResults);
    }

    private void doNext(int requestCode, int[] grantResults) {
        if (requestCode == MCApiConstants.MCH_READ_PHONE_STATE_REQUEST_CODE) {
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                Log.i(TAG, "设备码：" + MCApiFactory.getMCApi().getDeviceNo(MainActivity.this));
            } else {
                Toast.makeText(MainActivity.this, "限制后，无法读取手机唯一识别码！", Toast.LENGTH_LONG).show();
            }
        }
    }
}
